Spring ORM এবং Caching

Java Technologies - স্প্রিং ওআরএম (Spring ORM)
108
108

Spring ORM Hibernate এবং JPA-এর মাধ্যমে ডেটাবেস অপারেশন সম্পন্ন করে। Hibernate এবং JPA ডেটাবেস পারফরম্যান্স উন্নত করার জন্য Caching ব্যবহার করে। Caching ডেটা সংরক্ষণ করে, যাতে বারবার ডাটাবেস কল না করে দ্রুত রেসপন্স দেওয়া যায়।

Spring ORM এর সাথে Caching ব্যবহারে ডেটাবেস থেকে ফ্রিকোয়েন্ট ডেটা রিট্রাইভ করার খরচ কমে যায়, যা অ্যাপ্লিকেশনের কার্যকারিতা বাড়ায়।


Caching এর ধারণা

Caching হল ডেটার একটি অস্থায়ী স্টোরেজ, যা দ্রুত পুনরুদ্ধারযোগ্য। Hibernate বা JPA-এর ক্ষেত্রে দুটি প্রধান ধরণের Cache ব্যবহৃত হয়:

First-Level Cache (Session Cache)

  • Hibernate এর ডিফল্ট Cache
  • প্রতিটি Hibernate সেশনে একবার ব্যবহৃত Entity সেভ থাকে।
  • এই Cache স্বয়ংক্রিয় এবং ম্যানুয়াল কনফিগারেশন প্রয়োজন হয় না।
  • সেশন শেষে Cache পরিষ্কার হয়ে যায়।

উদাহরণ:

Session session = sessionFactory.openSession();
User user1 = session.get(User.class, 1L); // DB query executed
User user2 = session.get(User.class, 1L); // Cache hit, no DB query

Second-Level Cache

  • Hibernate বা JPA সেশন সীমার বাইরে Entity সংরক্ষণ করে।
  • পুরো অ্যাপ্লিকেশন জুড়ে Cache ডেটা রিইউজ করা যায়।
  • পৃথক কনফিগারেশন প্রয়োজন।
  • Cache Framework (EHCache, Redis, Hazelcast) ব্যবহার করে সেটআপ করা হয়।

সুবিধা:

  • ডেটাবেস লোড হ্রাস করে।
  • ডেটা অ্যাক্সেসের গতি বাড়ায়।

Hibernate Second-Level Cache সেটআপ

Dependency যোগ করা

EHCache Hibernate-এর জন্য সবচেয়ে জনপ্রিয় Cache Framework। নিচে Maven ডিপেন্ডেন্সি দেওয়া হলো:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>5.6.15.Final</version>
</dependency>
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.10.8</version>
</dependency>

Hibernate Configuration

Hibernate Configuration-এ Second-Level Cache সক্রিয় করতে হবে।

import org.hibernate.cache.jcache.ConfigSettings;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HibernateCacheConfig {

    @Bean
    public Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.cache.use_second_level_cache", "true");
        properties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.jcache.JCacheRegionFactory");
        properties.setProperty("hibernate.javax.cache.provider", "org.ehcache.jsr107.EhcacheCachingProvider");
        return properties;
    }
}

Entity-তে Caching কনফিগারেশন

Hibernate Cache কাজ করার জন্য Entity-তে @Cache অ্যানোটেশন ব্যবহার করা হয়। উদাহরণ:

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String email;

    // Getters and Setters
}

CacheConcurrencyStrategy এর ধরন

Hibernate Cache-এ Concurrency Strategy গুরুত্বপূর্ণ ভূমিকা পালন করে। বিভিন্ন স্ট্র্যাটেজি নিচে উল্লেখ করা হলো:

READ_ONLY

  • শুধুমাত্র পড়ার জন্য Cache।
  • ডেটা পরিবর্তনের প্রয়োজন নেই এমন ক্ষেত্রে ব্যবহার হয়।

NONSTRICT_READ_WRITE

  • ডেটা পরিবর্তন হতে পারে, তবে সঠিক সিঙ্ক্রোনাইজেশন নিশ্চিত হয় না।
  • কম ফ্রিকোয়েন্ট ডেটা অ্যাক্সেসের জন্য।

READ_WRITE

  • ডেটা পড়া এবং লেখা উভয়ের জন্য উপযুক্ত।
  • সিঙ্ক্রোনাইজড ডেটা অ্যাক্সেস নিশ্চিত করে।

TRANSACTIONAL

  • সম্পূর্ণ ট্রানজ্যাকশনাল Cache।
  • খুবই সুনির্দিষ্ট এবং নির্ভুল অ্যাপ্লিকেশনের জন্য।

Spring ORM এবং Caching এর সুবিধা

  • ডেটাবেস লোড কমায়।
  • ডেটা ফেচিং দ্রুত করে।
  • মেমরি ব্যবহারে কার্যকর।
  • বারবার ডেটা অ্যাক্সেসের সময় রেসপন্স টাইম কমিয়ে আনে।
  • বড় অ্যাপ্লিকেশনে পারফরম্যান্স উন্নত করে।

Spring ORM এবং Caching একত্রে ব্যবহারে অ্যাপ্লিকেশন পারফরম্যান্স উল্লেখযোগ্যভাবে বাড়ানো যায়। Cache এর প্রয়োজনীয়তা এবং ডেটার ধরণ অনুযায়ী Lazy Loading এবং Caching স্ট্র্যাটেজি নির্বাচন করা উচিত।

Content added By

ORM এ Caching এর প্রয়োজনীয়তা

74
74

Spring ORM (Object-Relational Mapping) এর মাধ্যমে ডাটাবেস অ্যাক্সেস করার সময় Caching গুরুত্বপূর্ণ ভূমিকা পালন করে। Caching মূলত এমন একটি প্রক্রিয়া যা ডাটাবেস থেকে পুনরাবৃত্ত ডেটা রিট্রিভ করার প্রয়োজনীয়তা কমিয়ে ডাটা অ্যাক্সেসকে দ্রুততর এবং কার্যকর করে তোলে। এটি ORM টুল যেমন Hibernate, JPA-তে ব্যবহৃত হয় এবং Spring ORM এই ফিচারগুলিকে সহজে একীভূত করতে সাহায্য করে।


Caching এর মৌলিক ধারণা

কীভাবে Caching কাজ করে?

Caching হল একটি প্রক্রিয়া যেখানে বারবার ব্যবহৃত ডেটা সাময়িকভাবে মেমোরিতে সংরক্ষণ করা হয়, যাতে পুনরায় ডাটাবেসে কল না করেও ডেটা দ্রুত অ্যাক্সেস করা যায়।


Caching এর প্রয়োজনীয়তা

ডাটাবেস অ্যাক্সেস কমানো

ORM এ প্রতিটি ডেটাবেজ কল সময় ও রিসোর্স খরচ করে। Caching ব্যবহার করলে ডেটা একবার রিট্রিভ হওয়ার পর সেটি মেমোরিতে সংরক্ষণ করা হয়, ফলে ডাটাবেসে অতিরিক্ত কলের প্রয়োজন হয় না।

পারফরম্যান্স বৃদ্ধি

Caching এর মাধ্যমে ডাটাবেস থেকে ডেটা রিট্রিভ করার পরিবর্তে মেমোরি থেকে ডেটা দ্রুত অ্যাক্সেস করা যায়, যা অ্যাপ্লিকেশনের কার্যকারিতা বৃদ্ধি করে।

নেটওয়ার্ক ট্রাফিক কমানো

ডাটাবেসে প্রতি কল নেটওয়ার্ক ট্রাফিক বৃদ্ধি করে। Caching ব্যবহার করলে ডাটাবেস কলের সংখ্যা কমে যায়, ফলে নেটওয়ার্ক ট্রাফিকও হ্রাস পায়।

স্কেলেবিলিটি বৃদ্ধি

Caching ব্যবহার করলে অ্যাপ্লিকেশন বড় ডেটাসেট এবং একাধিক ব্যবহারকারীর জন্য কার্যকরভাবে কাজ করতে পারে।


Hibernate এবং JPA-তে Caching এর ধরন

First-Level Cache

  • Hibernate বা JPA এর ডিফল্ট ক্যাশ।
  • প্রতিটি Session বা EntityManager-এর সঙ্গে যুক্ত থাকে।
  • একই ডেটা একাধিকবার রিট্রিভ হলে, এটি ডাটাবেসে কল না করে ক্যাশ থেকে ডেটা সরবরাহ করে।

Second-Level Cache

  • প্রয়োজনীয়ভাবে কনফিগার করতে হয়।
  • পুরো অ্যাপ্লিকেশনের জন্য একটি শেয়ার্ড ক্যাশ।
  • জনপ্রিয় Second-Level Cache প্রোভাইডার:
    • Ehcache
    • Infinispan
    • Redis
    • Hazelcast

Spring ORM এ Caching বাস্তবায়ন

First-Level Cache উদাহরণ

Hibernate Session এর First-Level Cache ডিফল্টভাবেই সক্রিয় থাকে।

Session session = sessionFactory.openSession();
Product product1 = session.get(Product.class, 1); // ডাটাবেস কল হবে
Product product2 = session.get(Product.class, 1); // ক্যাশ থেকে ডেটা আসবে

Second-Level Cache কনফিগারেশন

Hibernate Second-Level Cache সক্রিয় করার জন্য, নিচের ধাপগুলি অনুসরণ করুন:

1. hibernate.cfg.xml ফাইল কনফিগার করুন:

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

2. Entity-তে Caching অ্যানোটেশন যোগ করুন:

import jakarta.persistence.Entity;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
    // ফিল্ড এবং Getter/Setter
}

Caching এর সীমাবদ্ধতা

  1. ডেটা আপডেট ইস্যু: Cached ডেটা পরিবর্তনের ক্ষেত্রে ডেটা সিঙ্ক্রোনাইজেশনের সমস্যা হতে পারে।
  2. অতিরিক্ত মেমোরি ব্যবহার: ক্যাশ মেমোরি ব্যবহার করলে অতিরিক্ত RAM প্রয়োজন হতে পারে।
  3. জটিলতা বৃদ্ধি: Second-Level Cache ব্যবহারের জন্য অতিরিক্ত কনফিগারেশন এবং রক্ষণাবেক্ষণ প্রয়োজন।

কখন Caching ব্যবহার করবেন?

  • যখন অ্যাপ্লিকেশনে একই ডেটা বারবার অ্যাক্সেস করা হয়।
  • যখন ডাটাবেস কলের সংখ্যা কমিয়ে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি প্রয়োজন।
  • বড় ডেটাসেটের জন্য যেখানে ডেটা রিড-হেভি (read-heavy) অ্যাপ্লিকেশন।

ORM-এ Caching এর প্রয়োগ অ্যাপ্লিকেশনকে দ্রুত, কার্যকর, এবং স্কেলেবল করে তোলে। Spring ORM Hibernate এর মতো শক্তিশালী ORM টুলের সঙ্গে কাজ করায় Caching আরও সহজে বাস্তবায়নযোগ্য।

Content added By

Hibernate Second Level Cache এবং Query Cache এর ব্যবহার

63
63

Hibernate একটি শক্তিশালী ORM টুল যা ডেটাবেস অপারেশনে পারফরম্যান্স উন্নত করার জন্য ক্যাশিং মেকানিজম সরবরাহ করে। Hibernate এ ক্যাশিং দুটি স্তরে কাজ করে:

  1. First Level Cache: প্রতিটি সেশনের জন্য ডিফল্টভাবে সক্রিয় থাকে।
  2. Second Level Cache: পুরো অ্যাপ্লিকেশনের জন্য শেয়ারযোগ্য ক্যাশ মেকানিজম।
  3. Query Cache: Second Level Cache এর উপর ভিত্তি করে নির্দিষ্ট কাস্টম ক্যাশিং।

Hibernate Second Level Cache

Second Level Cache ডেটা সঞ্চালনে একটি শেয়ারযোগ্য ক্যাশ ব্যবস্থাপনা করে যা একাধিক সেশনের জন্য ব্যবহার করা যায়। এটি ডেটাবেসে পুনরাবৃত্তি অপারেশন কমিয়ে অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করে।

প্রতিস্থাপনযোগ্য ক্যাশ প্রোভাইডার:

  • Ehcache
  • Infinispan
  • Redis
  • Caffeine

Second Level Cache কনফিগারেশন

Maven ডিপেন্ডেন্সি

Ehcache প্রোভাইডার ব্যবহার করে Second Level Cache কনফিগার করার জন্য Maven ডিপেন্ডেন্সি যোগ করুন:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>5.6.15.Final</version>
</dependency>

Hibernate Configuration

application.properties ফাইলে Second Level Cache সক্রিয় করুন:

spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
spring.jpa.properties.javax.cache.provider=org.ehcache.jsr107.EhcacheCachingProvider

Entity-Level Configuration

@Cache অ্যানোটেশন ব্যবহার করে Second Level Cache কনফিগার করা হয়:

import jakarta.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "products")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "price")
    private Double price;

    // Getters and Setters
}

CacheConcurrencyStrategy Options:

  • READ_ONLY: ডেটা শুধুমাত্র পড়ার জন্য।
  • NONSTRICT_READ_WRITE: অপ্রচলিত ডেটা আপডেট করার অনুমতি।
  • READ_WRITE: পড়া এবং লেখা উভয়ের জন্য সঠিক সমন্বয়।
  • TRANSACTIONAL: সম্পূর্ণ ট্রানজ্যাকশনাল কনসিস্টেন্সি।

Query Cache

Query Cache একটি অতিরিক্ত ক্যাশিং মেকানিজম যা Hibernate এর HQL বা Criteria API এর জন্য ব্যবহৃত হয়। এটি সেকেন্ড লেভেল ক্যাশের ওপর নির্ভরশীল।


Query Cache কনফিগারেশন

Query Cache সক্রিয়করণ

application.properties ফাইলে Query Cache সক্রিয় করুন:

spring.jpa.properties.hibernate.cache.use_query_cache=true

Query Cache ব্যবহার

Query Cache ব্যবহার করতে হলে HQL বা Criteria Query তৈরি করতে হবে এবং সেটি ক্যাশ সক্ষম করতে হবে।

import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.stereotype.Repository;

@Repository
public class ProductRepository {

    @Autowired
    private Session session;

    public List<Product> getCachedProducts() {
        Query<Product> query = session.createQuery("from Product", Product.class);
        query.setCacheable(true); // Enable query caching
        return query.list();
    }
}

উদাহরণ: Second Level এবং Query Cache কার্যপ্রবাহ

ProductService ক্লাস

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    public List<Product> getProducts() {
        return productRepository.getCachedProducts();
    }
}

Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/products")
public class ProductController {

    @Autowired
    private ProductService productService;

    @GetMapping
    public List<Product> getAllProducts() {
        return productService.getProducts();
    }
}

Hibernate Second Level Cache এবং Query Cache এর সুবিধা

ক্যাশিং প্রকারসুবিধা
Second Level Cacheডেটাবেস হিট কমিয়ে দ্রুত ডেটা রিট্রাইভ করে।
Query Cacheবারবার এক্সিকিউট করা কুয়েরির ফলাফল ক্যাশ করে।

Hibernate Second Level এবং Query Cache ব্যবহার করে অ্যাপ্লিকেশনের কার্যক্ষমতা এবং পারফরম্যান্স অনেকাংশে বৃদ্ধি করা সম্ভব।

Content added By

Spring Cache Integration এর মাধ্যমে ORM Performance বৃদ্ধি

62
62

Spring Cache Integration স্প্রিং ওআরএম (Spring ORM) এর কার্যক্ষমতা বাড়ানোর জন্য একটি গুরুত্বপূর্ণ উপায়। এটি ডাটাবেস কোয়েরির ফলাফলকে ক্যাশে সংরক্ষণ করে পুনরায় কোয়েরি করার প্রয়োজনীয়তা কমায়, যা অ্যাপ্লিকেশনের গতিশীলতা উন্নত করে।


স্প্রিং ক্যাশ (Spring Cache) কী?

Spring Cache হলো একটি অ্যাবস্ট্রাকশন লেয়ার যা ডেটা বা কোয়েরির ফলাফলকে ইন-মেমরি ক্যাশে সংরক্ষণ করে। এটি অ্যাপ্লিকেশনের পারফরম্যান্স বাড়ায় এবং পুনরাবৃত্ত ডেটাবেস অ্যাক্সেস কমায়।


Spring Cache Integration এর গুরুত্বপূর্ণ বৈশিষ্ট্য

  1. ক্যাশ মেকানিজম: ডাটাবেসে একই কোয়েরি একাধিকবার করার পরিবর্তে ক্যাশে থেকে ডেটা ফেরত দেওয়া হয়।
  2. ক্যাশ স্টোরেজ: Spring বিভিন্ন ক্যাশ প্রদানকারী যেমন EhCache, Redis, Caffeine, বা SimpleCacheManager সমর্থন করে।
  3. অটোমেটেড কনফিগারেশন: Spring Boot Cache Starter ক্যাশ সেটআপ সহজ করে।

Spring Cache Integration এর ধাপসমূহ

১. Maven ডিপেনডেন্সি যোগ করা

Spring Boot ব্যবহার করলে Maven pom.xml এ নিম্নলিখিত ডিপেনডেন্সি যোগ করতে হবে:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

প্রয়োজন অনুযায়ী, নির্দিষ্ট ক্যাশ টেকনোলজির জন্য ডিপেনডেন্সি যোগ করুন (যেমন EhCache বা Redis)।


২. @EnableCaching ব্যবহার করে ক্যাশিং সক্রিয় করা

Spring Cache সক্রিয় করতে প্রধান ক্লাসে @EnableCaching অ্যানোটেশন ব্যবহার করতে হবে:

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableCaching
public class SpringOrmCacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringOrmCacheApplication.class, args);
    }
}

৩. ক্যাশিং যোগ করা @Cacheable অ্যানোটেশন ব্যবহার করে

কোনো মেথডে ক্যাশিং প্রয়োগ করতে @Cacheable অ্যানোটেশন ব্যবহার করা হয়। উদাহরণস্বরূপ:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable("users")
    public User findUserById(Long id) {
        // Mock database call
        System.out.println("Fetching user from database...");
        return new User(id, "John Doe");
    }
}

ব্যাখ্যা:

  • @Cacheable("users"): মেথডের রিটার্ন ভ্যালুকে users নামক ক্যাশে সংরক্ষণ করে।
  • প্রথমবার ডেটাবেস থেকে ডেটা নিয়ে আসা হবে এবং পরবর্তী সময়ে ক্যাশ থেকে তা রিটার্ন করা হবে।

৪. ক্যাশ ম্যানেজমেন্ট কাস্টমাইজেশন (অপশনাল)

Spring Boot এর ডিফল্ট SimpleCacheManager ব্যবহার করে। তবে, উন্নত পারফরম্যান্সের জন্য EhCache বা Redis ইন্টিগ্রেট করা যেতে পারে।

EhCache কনফিগারেশন উদাহরণ: ehcache.xml ফাইল তৈরি করুন:

<ehcache>
    <cache name="users"
           maxEntriesLocalHeap="1000"
           timeToLiveSeconds="3600">
    </cache>
</ehcache>

Spring Configuration ক্লাসে EhCache যোগ করুন:

import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new EhCacheCacheManager(ehCacheManagerFactoryBean().getObject());
    }

    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
        EhCacheManagerFactoryBean factory = new EhCacheManagerFactoryBean();
        factory.setConfigLocation(new ClassPathResource("ehcache.xml"));
        factory.setShared(true);
        return factory;
    }
}

Hibernate Second-Level Cache

Spring Cache Integration এর পাশাপাশি Hibernate এর Second-Level Cache ব্যবহার করা ORM পারফরম্যান্স বাড়াতে পারে।

Second-Level Cache সক্রিয় করার জন্য:

application.properties এ কনফিগারেশন যোগ করুন:

spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
spring.jpa.properties.hibernate.cache.use_query_cache=true

Hibernate এ Second-Level Cache ক্যাশ প্যারামিটার সংরক্ষণ করে, যা স্প্রিং ক্যাশের সাথে সম্পূর্ণরূপে একীভূত হয়।


সারাংশ

Spring Cache Integration এবং Hibernate Second-Level Cache একত্রে ব্যবহার করলে স্প্রিং ওআরএম এর কার্যক্ষমতা উল্লেখযোগ্যভাবে বৃদ্ধি পায়। ক্যাশিং পদ্ধতিতে ইন-মেমরি ডেটা স্টোরেজ ব্যবহার করে ডেটাবেস অ্যাক্সেসের সময় এবং খরচ কমানো হয়। Redis বা EhCache এর মতো উন্নত ক্যাশ সিস্টেম ব্যবহার করলে আরও উন্নত পারফরম্যান্স নিশ্চিত করা যায়।

Content added By

উদাহরণ সহ Caching Implementation

105
105

ক্যাশিং কি?

Caching হলো ডেটা স্টোর করার একটি মেকানিজম, যা বারবার ডাটাবেজে অ্যাকসেস না করে প্রয়োজনীয় ডেটা দ্রুত সরবরাহ করতে সহায়তা করে। Spring ORM এ Hibernate এর ক্যাশিং মেকানিজম ব্যবহার করে ডাটাবেজ অপারেশনের পারফরম্যান্স বৃদ্ধি করা যায়। Hibernate দুই ধরনের ক্যাশিং সরবরাহ করে:

  1. First Level Cache: ডিফল্টভাবে সক্রিয় এবং একটি সেশন পর্যন্ত সীমাবদ্ধ।
  2. Second Level Cache: কনফিগারেশন-ভিত্তিক এবং একাধিক সেশনের মধ্যে শেয়ার করা যায়।

ক্যাশিং এর ধাপ

১. First Level Cache

Hibernate সেশনের লেভেলে স্বয়ংক্রিয়ভাবে কাজ করে। এই ক্যাশিং এর জন্য আলাদা কোনো কনফিগারেশন প্রয়োজন নেই।

২. Second Level Cache

Spring ORM এ Hibernate Second Level Cache ব্যবহার করতে হলে এটি স্পষ্টভাবে কনফিগার করতে হয়। Hibernate বিভিন্ন ক্যাশিং প্রোভাইডার সাপোর্ট করে, যেমন:

  • Ehcache
  • Redis
  • Infinispan

উদাহরণ সহ Second Level Cache ইমপ্লিমেন্টেশন

প্রয়োজনীয় ডিপেনডেন্সি

Maven এর pom.xml ফাইলে Hibernate এবং Ehcache এর ডিপেনডেন্সি যোগ করুন:

<dependencies>
    <!-- Hibernate Core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.6.15.Final</version>
    </dependency>

    <!-- Hibernate Ehcache -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>5.6.15.Final</version>
    </dependency>

    <!-- Spring ORM -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>5.3.29</version>
    </dependency>
</dependencies>

Hibernate কনফিগারেশন ফাইল

Hibernate এর hibernate.cfg.xml ফাইলে Second Level Cache এর জন্য কনফিগারেশন যোগ করুন:

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">password</property>
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>

        <!-- Hibernate properties -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="hibernate.show_sql">true</property>

        <!-- Enable Second Level Cache -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
        <property name="hibernate.cache.use_query_cache">true</property>
    </session-factory>
</hibernate-configuration>

Ehcache কনফিগারেশন ফাইল

Ehcache এর জন্য ehcache.xml ফাইল তৈরি করুন:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://www.ehcache.org/ehcache.xsd">
    <cache name="com.example.Employee"
           maxEntriesLocalHeap="1000"
           timeToLiveSeconds="300">
    </cache>
</ehcache>

Entity ক্লাস

ক্যাশিং যোগ করার জন্য Entity ক্লাসে @Cache অ্যানোটেশন যোগ করুন:

Employee.java

import jakarta.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
    @Id
    private int id;
    private String name;
    private String department;

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }
}

DAO ক্লাসে ক্যাশিং পরীক্ষা

EmployeeDAO.java

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.transaction.Transactional;

@Repository
public class EmployeeDAO {

    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public Employee getEmployeeById(int id) {
        Session session = sessionFactory.getCurrentSession();
        return session.get(Employee.class, id); // First Level Cache
    }

    @Transactional
    public Employee getEmployeeWithSecondLevelCache(int id) {
        Session session = sessionFactory.getCurrentSession();
        return session.get(Employee.class, id); // Second Level Cache
    }
}

Main ক্লাস

App.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        EmployeeDAO employeeDAO = context.getBean(EmployeeDAO.class);

        // First Query (Hits Database)
        Employee emp1 = employeeDAO.getEmployeeById(1);
        System.out.println("Employee 1: " + emp1.getName());

        // Second Query (Uses Cache)
        Employee emp2 = employeeDAO.getEmployeeWithSecondLevelCache(1);
        System.out.println("Employee 2: " + emp2.getName());
    }
}

ক্যাশিং এর সুবিধা এবং সীমাবদ্ধতা

সুবিধা:

  • ডাটাবেস লোড কমায়।
  • অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করে।
  • বারবার ডেটা ফেচিং এ সময় সাশ্রয় করে।

সীমাবদ্ধতা:

  • কনফিগারেশন জটিল।
  • ক্যাশিং সঠিকভাবে ব্যবস্থাপনা না করলে Stale Data সমস্যার উদ্ভব হতে পারে।
  • মেমরি ব্যবহারের জন্য অতিরিক্ত রিসোর্স প্রয়োজন।

Hibernate Second Level Cache এর মাধ্যমে Spring ORM এ কার্যকর ক্যাশিং বাস্তবায়ন করা যায়। Ehcache এর মত ক্যাশিং প্রোভাইডার ব্যবহার করে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করা সহজ হয়।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion